#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import xlrd
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
import os
import csv
import matplotlib.pyplot as plt
import matplotlib.pyplot as bar
import numpy as np
import threading


BaseDados = create_engine('sqlite:///LP.db')
metadata = MetaData(BaseDados)
Session=sessionmaker(bind=BaseDados)
session=Session()

'''
BaseDados.echo = False  
'''

#lista de listas que vai conter os dados de cada coluna
DadosFormatados=[]
def AbrirFicheiro(filename):

    try:
        for coluna in xlread(filename):
            lerColunas(coluna) 
        pass
    except IOError,error:
        print  error ,"\n Coloca o ficheiro Inscritos_2010-2011.xls na directoria do  codigo fonte "
    pass
pass
# Funçao que vai criar a BD,com as colunas correspondentes e preenche-las com os dados do ficheiro xls
def CriarBD():
    try:
        if not os.path.exists('LP.db'):
            if(len(DadosFormatados))!=0:
                tabela=Tabela()
                PreencherTabela(tabela,DadosFormatados,Colunas)
            return tabela
        pass
    except:
        print "Abrir ficheiro (xls) primeiro"
        pass
# Funçao que vai ler as pesquisas correspondente seleccionada
def Pesquisas(inteiro):
    if inteiro==1:
        pesquisa1(tabela)
    if inteiro==2:
        pesquisa2(tabela)
    if inteiro==3:
        pesquisa3(tabela)
    if inteiro==4:
        pesquisa4(tabela)
    pass

def xlread(arq_xls):
    try:
        # Abre o arquivo
        xls = xlrd.open_workbook(arq_xls)
        # Selecciona folha do arquivo
        plan = xls.sheets()[30]
        #Corre coluna a coluna
        for i in xrange(plan.ncols):
            # le os valores das linhas a partir da linha 4 a linha 11957 da coluna selecionada
            yield plan.col_values(i,start_rowx=4, end_rowx=11957)
        pass
    except:
        print "Ficheiro Errado"
pass

Colunas=['Estabelecimento_de_Ensino','Unidade_Organica','Nivel_de_Formacao','Curso_Superior','Area_de_Educacao_e_Formacao',
'1995/96/H','1995/96/M','1995/96/HM','1996/97/H','1996/97/M','1996/97/HM','1997/98/H','1997/98/M','1997/98/HM','1998/99/H',
'1998/99/M','1998/99/HM','1999/00/H','1999/00/M','1999/00/HM','2000/01/H','2000/01/M','2000/01/HM','2001/02/H',
'2001/02/M','2001/02/HM','2002/03/H','2002/03/M','2002/03/HM','2003/04/H','2003/04/M','2003/04/HM','2004/05/H',
'2004/05/M','2004/05/HM','2005/06/H','2005/06/M','2005/06/HM','2006/07/H','2006/07/M','2006/07/HM','2007/08/H',
'2007/08/M','2007/08/HM','2008/09/H','2008/09/M','2008/09/HM','2009/10/H','2009/10/M','2009/10/HM','2010/11/H',
'2010/11/M','2010/11/HM']

# Funcão que pega numa lista com os dados de uma coluna e formata-os dados para estarem prontos para inserir na BD
def lerColunas(lista):
    dados=[]
    k=None
    for i in lista:
        if i == (''):
            if k !=(None):
                dados.append(k)
            pass
        else:
            k=i
            dados.append(k)
        pass
    pass
    if(len(dados)!=0):
        DadosFormatados.append(dados)
    pass   
pass


#tabela com as respectivas colunas
tabela= Table('tabela', metadata,
    Column('Linha_id', Integer, primary_key=True),
    Column('Estabelecimento_de_Ensino', String(100)),
    Column('Unidade_Organica', String(100)),
    Column('Nivel_de_Formacao', String(100)),
    Column('Curso_Superior',String(100)),
    Column('Area_de_Educacao_e_Formacao',String(100)),
    Column('1995/96/H', Integer),
    Column('1995/96/M', Integer),
    Column('1995/96/HM', Integer),
    Column('1996/97/H', Integer),
    Column('1996/97/M', Integer),
    Column('1996/97/HM', Integer),
    Column('1997/98/H', Integer),
    Column('1997/98/M', Integer),
    Column('1997/98/HM', Integer),
    Column('1998/99/H', Integer),
    Column('1998/99/M', Integer),
    Column('1998/99/HM', Integer),
    Column('1999/00/H', Integer),
    Column('1999/00/M', Integer),
    Column('1999/00/HM', Integer),
    Column('2000/01/H', Integer),
    Column('2000/01/M', Integer),
    Column('2000/01/HM', Integer),
    Column('2001/02/H', Integer),
    Column('2001/02/M', Integer),
    Column('2001/02/HM', Integer),
    Column('2002/03/H', Integer),
    Column('2002/03/M', Integer),
    Column('2002/03/HM', Integer),
    Column('2003/04/H', Integer),
    Column('2003/04/M', Integer),
    Column('2003/04/HM', Integer),
    Column('2004/05/H', Integer),
    Column('2004/05/M', Integer),
    Column('2004/05/HM', Integer),
    Column('2005/06/H', Integer),
    Column('2005/06/M', Integer),
    Column('2005/06/HM', Integer),
    Column('2006/07/H', Integer),
    Column('2006/07/M', Integer),
    Column('2006/07/HM', Integer),
    Column('2007/08/H', Integer),
    Column('2007/08/M', Integer),
    Column('2007/08/HM', Integer),
    Column('2008/09/H', Integer),
    Column('2008/09/M', Integer),
    Column('2008/09/HM', Integer),
    Column('2009/10/H', Integer),
    Column('2009/10/M', Integer),
    Column('2009/10/HM', Integer),
    Column('2010/11/H', Integer),
    Column('2010/11/M', Integer),
    Column('2010/11/HM', Integer),
)
# Cria a tabela
def Tabela():
    tabela.create()
    return tabela
pass
# Funçao que vai preencher as colunas da tabela
def PreencherTabela(tabela,DadosFormatados,Colunas):
    inserir=[]
    for k in range(len(DadosFormatados[0])):
        s=({Colunas[i]:DadosFormatados[i][k] for i in range(0,len(Colunas),1)})
        inserir.append(s)
    pass
    tabela.insert().execute(inserir)
pass

# Funçao que faz a pesquisa dos cursos que incluem o termo computadores e informática, em associação com o estabeleci-
# mento de ensino, unidade orgânica e anos letivos em que funcionaram;

def pesquisa1(tabela):

    try:
        if os.path.exists('LP.db'):
            listaCSV=[]
            ficheiro=open("pesquisa1.csv","w")

            selecionar = tabela.select(and_(tabela.c.Curso_Superior.like('%informática%'.decode('utf-8'))\
                                        ,tabela.c.Curso_Superior.like('%computadores%'.decode('utf-8'))))
            for i in selecionar.execute():
                ano=[]
                for k in range(7,len(Colunas),3) :
                    if i[Colunas[k]] != "-": ano.append(Colunas[k].replace("/HM",""))
                listaCSV.append([ i[Colunas[3]].encode('utf-8'), i[Colunas[0]].encode('utf-8'),i[Colunas[1]].encode('utf-8'), ','.join(ano)])      
            pass
            ficheiro.write(str(["Curso_Superior","Estabelecimento_de_Ensino","Unidade_Organica","Ano Lectivo"]).strip('[]')+'\n')
            ficheiro.write('\n'.join(str(listaCSV[k] ).encode('utf-8').strip('[]')for k in range(len(listaCSV))))
            ficheiro.close()
        pass
    except:
        print "Criar BD Primeiro"
    pass
pass
# Funçao que faz a pesquisa da quantidade de alunos que nestes se inscreveram ao longo dos anos;
def pesquisa2(tabela):

    try:
        if os.path.exists('LP.db'):
            listaCSV=[]
            ficheiro=open("pesquisa2.csv","w")

            selecionar = tabela.select(and_(tabela.c.Curso_Superior.like('%informática%'.decode('utf-8'))\
                                        ,tabela.c.Curso_Superior.like('%computadores%'.decode('utf-8'))))
            for i in selecionar.execute():
                ano=[]
                TotalAlunosAno=[]
                for k in range(7,len(Colunas),3) :
                    if i[Colunas[k]] != "-": 
                        ano.append(Colunas[k].replace("/HM",""))
                        TotalAlunosAno.append(i[Colunas[k]])
                    pass
                pass
       
                listaCSV.append([i[Colunas[3]].encode('utf-8'),','.join(ano),str(TotalAlunosAno).strip('[]')]) 
            pass
            ficheiro.write(str(["Curso_Superior","Ano Lectivo","Total Inscritos"]).strip('[]')+'\n')
            ficheiro.write('\n'.join(str(listaCSV[k] ).strip('[]')for k in range(len(listaCSV))))
            ficheiro.close()
        pass
    except:
        print "Criar BD Primeiro"
    pass
pass
# Funçao que faz a pesquisa da quantidade de cursos por nível de formação ao longo dos anos;
def pesquisa3(tabela):
    try:
        if os.path.exists('LP.db'):
            listaCSV=[]
            ficheiro=open("pesquisa3.csv","w")

            for f in range(7,len(Colunas),3):
                for selecionar in session.query(tabela.c.Nivel_de_Formacao,func.count(tabela.c.Curso_Superior)).\
                                                filter(tabela.c[Colunas[f]] != '-').group_by(tabela.c.Nivel_de_Formacao):
                    listaCSV.append([selecionar[0].encode('utf-8'),selecionar[1],Colunas[f].replace("/HM","")])
                pass
            pass

            ficheiro.write(str(["Nivel_de_Formacao","Cursos","Ano"]).strip('[]')+'\n')
            ficheiro.write('\n'.join(str(listaCSV[k] ).strip('[]')for k in range(len(listaCSV))))
            ficheiro.close()
        pass
    except:
        print "Criar BD Primeiro"
pass
# Funçao que faz a pesquisa da quantidade de alunos por nível de formação ao longo dos anos.

def pesquisa4(tabela):

    try:
        if os.path.exists('LP.db'):
            listaCSV=[]
            ficheiro=open("pesquisa4.csv","w")

            for f in range(7,len(Colunas),3):
                for selecionar in session.query(tabela.c.Nivel_de_Formacao,func.count(tabela.c[Colunas[f]])).\
                                            filter(tabela.c[Colunas[f]] != '-').group_by(tabela.c.Nivel_de_Formacao):
                    listaCSV.append([selecionar[0].encode('utf-8'),selecionar[1],Colunas[f].replace("/HM","")]) 
                pass
            pass


            ficheiro.write(str(["Nivel_de_Formacao","Alunos","Ano"]).strip('[]')+'\n')
            ficheiro.write('\n'.join(str(listaCSV[k] ).strip('[]')for k in range(len(listaCSV))))
            ficheiro.close()
        pass
    except:
        print "CriarBD Primeiro"
    pass   
pass
# Funçao que actualiza as listBox com os nomes dos cursos e dos niveis de formaçao
def ActualizarLista():
    lista1=[]
    lista2=[]
    lista=[]
    if os.path.exists('LP.db'):
        for selecionar in session.query(tabela.c.Curso_Superior).group_by(tabela.c.Curso_Superior):
            lista1.append(selecionar[0].encode('utf-8'))
        pass

        for selecionar in session.query(tabela.c.Nivel_de_Formacao).group_by(tabela.c.Nivel_de_Formacao):
            lista2.append(selecionar[0].encode('utf-8'))
        pass
        
        lista.append(lista1)
        lista.append(lista2)
        return lista
    pass
    return lista
pass
# Funçao que ira realizar a pesquisa dos dados para o  grafico do curso/ nivel formaçao seleccionado e accionar a funçao que os
# fara 
def Graficos(itemSeleccionado,listaNumero):
    try:
        dadosGraficos=[]
        if listaNumero==1:
            ColunaName=tabela.c.Nivel_de_Formacao
        pass
        if listaNumero==2:
            ColunaName=tabela.c.Curso_Superior
        pass
        seleccaoNome= itemSeleccionado
        for f in range(7,len(Colunas),3):
            for selecionar in session.query(ColunaName,func.count(tabela.c[Colunas[f]])).\
                                            filter(ColunaName==itemSeleccionado).\
                                            filter(tabela.c[Colunas[f]] != '-').group_by(ColunaName):
                dadosGraficos.append([selecionar[0].encode('utf-8'),selecionar[1],Colunas[f].replace("/HM","")]) 
            pass
        pass
    
        t = threading.Thread(target=GraficosPlot,args=([dadosGraficos]))
        t.start()
    except RuntimeError,error:
        print error
    pass
pass
# Funçao que ira realizar o grafico com as informaçoes passadas por parametro
def GraficosPlot(DadosGraficos):
    
    dados12=[]
    dadosdedados=[]
    for i in range(len(DadosGraficos)):
        dados12.append(DadosGraficos[i][1])
    pass

    plt.clf()
    plt.xlabel('Anos')
    plt.ylabel('Alunos')
    plt.title('Grafico')
    plt.plot([i for i in range(len(dados12))],[dados12[i] for i in range(len(dados12))],'r')
    plt.xticks([i for i in range(len(dados12))],('95/96','96/97','97/98','98/99','99/00',
                    '00/01','01/02','02/03','03/04','04/05','05/06','06/07','07/08','08/09','09/10','10/11'))
    plt.show()
pass
